package com.hwd.gmall.order.config;

import lombok.extern.log4j.Log4j2;
import org.springframework.amqp.core.Message;
import org.springframework.amqp.rabbit.connection.CorrelationData;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.lang.Nullable;
import org.springframework.stereotype.Component;

/**
 * 消息的可靠性投机的配置类
 *
 * @author 黄伟东/Victor
 * @date 2022/5/9 16:44
 */
@Component
@Log4j2
public class OrderMqCallBackConfig implements RabbitTemplate.ConfirmCallback, RabbitTemplate.ReturnCallback {

    /**
     * 消息的确认模式
     *
     * @param correlationData 元数据
     * @param ack             消息是否到达了交换机
     * @param cause           错误描述
     */
    @Override
    public void confirm(CorrelationData correlationData, boolean ack, String cause) {
        // 判断消息是否到达了交换机
        if (ack) {
            log.info("消息到达了交换机！");
        } else {
            log.error("消息没有到达交换机，错误描述是 = " + cause);
        }
    }

    /**
     * 设置消息的回退模式
     *
     * @param message    消息体
     * @param replyCode  状态码
     * @param replyText  状态描述
     * @param exchange   交换机的名字
     * @param routingKey 消息的路由
     */
    @Override
    public void returnedMessage(Message message, int replyCode,
                                @Nullable String replyText,
                                @Nullable String exchange,
                                @Nullable String routingKey) {
        // 定义return模式确保消息进入消息队列，若触发这个方法代表消息没有投递到队列
        log.error("消息的内容是 = " + new String(message.getBody()));
        log.error("状态码是 = " + replyCode);
        log.error("状态描述是 = " + replyText);
        log.error("交换机的名字是 = " + exchange);
        log.error("消息的路由是 = " + routingKey);
    }
}
